package nl.ordina.ott.java.client.model;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.TextBox;

public class Vakje extends TextBox {
	public static final int GEEN_GECONCLUDEERDE_WAARDE = 0;

	private final List<Integer> opties = new ArrayList<Integer>(9);
	private final List<VakjesGroep> vakjesGroepen = new ArrayList<VakjesGroep>(3);
	private int geconcludeerdeWaarde = Vakje.GEEN_GECONCLUDEERDE_WAARDE;

	public Vakje() {
		for (int optie = 1; optie <= 9; optie++) {
			opties.add(optie);
		}
		addChangeHandler(new ConclusieChangeHandler(this));
		addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (!isGeconcludeerd()) {
					setText("");
				}
			}
		});
	}

	public List<Integer> getOpties() {
		return this.opties;
	}

	public boolean heeftOptie(int optie) {
		return this.opties.contains(optie);
	}
	
	public int getGeconcludeerdeWaarde() {
		return geconcludeerdeWaarde;
	}
	
	public List<VakjesGroep> getVakjesGroepen() {
		return vakjesGroepen;
	}
	
	public boolean isGeconcludeerd() {
		return this.geconcludeerdeWaarde != Vakje.GEEN_GECONCLUDEERDE_WAARDE;
	}

	public boolean concludeer(int waarde) {
		if (heeftOptie(waarde)) {
			this.geconcludeerdeWaarde = waarde;
			this.addStyleName("geconcludeerd");
			this.opties.clear();
			Oplosser.getOplosser().addSudokuGebeurtenis(new ConclusieGebeurtenis(this, waarde));
			setText("" + waarde);
			return true;
		}
		return false;
	}

	public String getMogelijkeOpties() {
		if (this.opties.size() < 5) {
			StringBuffer sb = new StringBuffer();
			for (int optie: this.opties) {
				sb.append(optie);
				sb.append(" ");
			}
			return sb.toString();
		}
		return "";
	}
	
	public boolean elimineerOptie(int optie) {
		if (this.opties.remove(new Integer(optie))) {
			Oplosser.getOplosser().addSudokuGebeurtenis(new ElimineerGebeurtenis(this, optie));
			setText(getMogelijkeOpties());
			return true;
		}
		return false;
	}

	public void addVakjesGroep(VakjesGroep vakjesGroep) {
		this.vakjesGroepen.add(vakjesGroep);
	}
}